import 'dart:async';
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/services/index.dart';
import '../../../common/routers/index.dart';
import '../../../common/api/index.dart';

/// 登录页面控制器
/// 负责登录页面的状态管理、表单验证和登录业务逻辑
class LoginController extends GetxController {
  // 1. 静态常量（类级别）
  static const String tag = 'LoginController';
  static const int maxRetryCount = 3;
  static const Duration animationDuration = Duration(milliseconds: 800);
  static const Duration loadingDelay = Duration(milliseconds: 1000);
  static const int smsCodeCountdown = 60; // 验证码倒计时秒数
  
  // 2. 实例常量
  final String pageTitle = '登录';
  final String welcomeText = '欢迎回来';
  final String subtitleText = '墨韵心境，静待花开';
  
  // 3. 响应式变量（Rx系列）
  // 基础类型 - 使用.obs写法（推荐95%场景）
  var isLoading = false.obs;                    // RxBool - 加载状态
  var isAgreeProtocol = false.obs;             // RxBool - 同意用户协议
  var hasError = false.obs;                    // RxBool - 错误状态
  var phoneNumber = ''.obs;                    // RxString - 手机号
  var verificationCode = ''.obs;               // RxString - 验证码输入
  var errorMessage = ''.obs;                   // RxString - 错误信息
  var loginAttempts = 0.obs;                   // RxInt - 登录尝试次数
  var logoScale = 0.8.obs;                     // RxDouble - Logo缩放动画
  var formOpacity = 0.0.obs;                   // RxDouble - 表单透明度动画
  var smsCountdown = 0.obs;                    // RxInt - 验证码倒计时
  var isSendingSms = false.obs;                // RxBool - 正在发送验证码
  
  // 集合类型 - 使用.obs写法
  var validationErrors = <String, String>{}.obs; // RxMap - 表单验证错误
  
  // 可空类型 - 特殊场景使用
  var lastLoginTime = RxnString();             // 可空字符串 - 上次登录时间
  
  // 4. 普通变量（非响应式）
  bool _isInitialized = false;
  String _generatedCode = '';  // 前端生成的6位验证码
  Timer? _animationTimer;
  Timer? _formTimer;
  Timer? _smsCountdownTimer;
  Timer? _errorClearTimer;  // 错误信息自动清除定时器
  int _retryCount = 0;
  
  // 5. 控制器和服务依赖
  final TextEditingController phoneController = TextEditingController();
  final TextEditingController codeController = TextEditingController();
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  final FocusNode phoneFocusNode = FocusNode();
  final FocusNode codeFocusNode = FocusNode();
  
  // 服务依赖
  StorageService get _storageService => Get.find<StorageService>();
  BusinessOrchestrationService get _businessService => Get.find<BusinessOrchestrationService>();
  
  // 6. 构造函数
  LoginController() {
    debugPrint('$tag: Constructor');
    
    // 确保动画变量的安全初始值
    logoScale.value = 0.8;
    formOpacity.value = 0.0;
  }

  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化登录页面数据');
    
    // 加载保存的登录信息
    _loadSavedCredentials();
    
    // 启动入场动画
    _startEntranceAnimation();
    
    _isInitialized = true;
    update(["login"]);
  }
  
  /// 加载保存的登录凭据
  void _loadSavedCredentials() {
    try {
      // ❌ 不再自动加载手机号
      // ❌ 不再默认勾选协议
      // 用户需要每次手动输入手机号和勾选协议
      
      // 仅获取上次登录时间用于统计
      lastLoginTime.value = _storageService.getString('last_login_time');
      
      debugPrint('$tag: 登录信息已清空，需要手动输入');
    } catch (e) {
      debugPrint('$tag: 加载登录信息失败: $e');
    }
  }
  
  /// 生成6位验证码（特定手机号使用固定验证码）
  String _generateVerificationCode() {
    final phone = phoneNumber.value.trim();
    
    // 特定手机号使用固定验证码
    if (phone == '19999999999') {
      debugPrint('$tag: 🔢 使用固定验证码: 888888 (手机号: $phone)');
      return '888888';
    } else if (phone == '18366542015') {
      debugPrint('$tag: 🔢 使用固定验证码: 123456 (手机号: $phone)');
      return '123456';
    }
    
    // 其他手机号生成随机验证码
    final random = Random();
    final code = (100000 + random.nextInt(900000)).toString();
    debugPrint('$tag: 🔢 生成随机验证码: $code (手机号: $phone)');
    return code;
  }
  
  /// 启动入场动画
  void _startEntranceAnimation() {
    // Logo缩放动画
    logoScale.value = 0.8;
    formOpacity.value = 0.0;
    
    _animationTimer = Timer.periodic(const Duration(milliseconds: 50), (timer) {
      if (logoScale.value < 1.0) {
        logoScale.value = (logoScale.value + 0.02).clamp(0.0, 1.0);
      } else {
        logoScale.value = 1.0; // 确保最终值为1.0
        timer.cancel();
        // Logo动画完成后开始表单动画
        _startFormAnimation();
      }
      update(["login"]);
    });
  }
  
  /// 启动表单显示动画
  void _startFormAnimation() {
    _formTimer = Timer.periodic(const Duration(milliseconds: 30), (timer) {
      if (formOpacity.value < 1.0) {
        formOpacity.value = (formOpacity.value + 0.05).clamp(0.0, 1.0);
        update(["login"]);
      } else {
        formOpacity.value = 1.0; // 确保最终值为1.0
        timer.cancel();
        _formTimer = null;
      }
    });
  }

  // 8. 业务方法
  
  /// 手机号输入变化处理
  void onPhoneNumberChanged(String value) {
    phoneNumber.value = value;
    _clearFieldError('phone');
    update(["login"]);
  }
  
  /// 验证码输入变化处理
  void onVerificationCodeChanged(String value) {
    verificationCode.value = value;
    _clearFieldError('code');
    update(["login"]);
  }
  
  /// 切换同意协议状态
  void toggleAgreeProtocol() {
    isAgreeProtocol.value = !isAgreeProtocol.value;
    update(["login"]);
  }
  
  /// 发送验证码按钮点击处理
  void onSendCodeTap() async {
    debugPrint('$tag: 点击发送验证码');
    
    // 验证手机号
    if (!_validatePhoneNumber()) {
      return;
    }
    
    // 检查是否同意协议
    if (!isAgreeProtocol.value) {
      hasError.value = true;
      errorMessage.value = '请先同意《用户手册》和《隐私政策》';
      update(["login"]);
      // 2秒后自动清除错误信息
      _startErrorClearTimer();
      return;
    }
    
    // 检查是否在倒计时中
    if (smsCountdown.value > 0) {
      debugPrint('$tag: 验证码倒计时中，剩余${smsCountdown.value}秒');
      return;
    }
    
    await _sendVerificationCode();
  }
  
  /// 发送验证码
  Future<void> _sendVerificationCode() async {
    try {
      isSendingSms.value = true;
      hasError.value = false;
      errorMessage.value = '';
      update(["login"]);
      
      // 生成6位验证码
      _generatedCode = _generateVerificationCode();
      
      debugPrint('$tag: 调用发送短信验证码API');
      
      // 调用API发送验证码
      final result = await UserApi.sendSmsCode(
        userPhone: phoneNumber.value.trim(),
        verificationCode: _generatedCode,
      );
      
      // 检查发送结果
      final status = result['status']?.toString();
      if (status == 'success') {
        debugPrint('$tag: 验证码发送成功');
        
        // 启动倒计时
        _startSmsCountdown();
      } else {
        final message = result['message']?.toString() ?? '发送验证码失败';
        _handleSendCodeFailure(message);
      }
    } catch (e) {
      debugPrint('$tag: 发送验证码异常: $e');
      _handleSendCodeFailure('网络连接异常，请检查网络后重试');
    } finally {
      isSendingSms.value = false;
      update(["login"]);
    }
  }
  
  /// 处理发送验证码失败
  void _handleSendCodeFailure(String message) {
    hasError.value = true;
    errorMessage.value = message;
    update(["login"]);
    
    // 2秒后自动清除错误信息
    _startErrorClearTimer();
  }
  
  /// 启动短信倒计时
  void _startSmsCountdown() {
    smsCountdown.value = smsCodeCountdown;
    update(["login"]);
    
    _smsCountdownTimer?.cancel();
    _smsCountdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (smsCountdown.value > 0) {
        smsCountdown.value--;
        update(["login"]);
      } else {
        timer.cancel();
        _smsCountdownTimer = null;
      }
    });
  }
  
  /// 登录按钮点击处理
  void onLoginTap() async {
    if (!_isInitialized) {
      debugPrint('$tag: 控制器未初始化，忽略登录操作');
      return;
    }
    
    debugPrint('$tag: 开始登录流程');
    
    // 清除焦点
    phoneFocusNode.unfocus();
    codeFocusNode.unfocus();
    
    // 表单验证
    if (!_validateForm()) {
      debugPrint('$tag: 表单验证失败');
      return;
    }
    
    await _performLogin();
  }
  
  /// 执行登录逻辑（使用业务编排服务）
  Future<void> _performLogin() async {
    try {
      isLoading.value = true;
      hasError.value = false;
      errorMessage.value = '';
      _retryCount = 0;
      update(["login"]);
      
      debugPrint('$tag: 🔐 =============== 开始登录/注册流程 ===============');
      
      // 🔥 调用业务编排服务统一处理登录流程
      final result = await _businessService.login(
        userPhone: phoneNumber.value.trim(),
        verificationCode: verificationCode.value.trim(),
        generatedCode: _generatedCode,
      );
      
      if (result['status'] == 'success') {
        debugPrint('$tag: ✅ 登录成功');
        
        // 清空验证码和倒计时
        verificationCode.value = '';
        codeController.clear();
        _generatedCode = '';
        _smsCountdownTimer?.cancel();
        smsCountdown.value = 0;
        
        // 保存登录凭据
        await _saveCredentialsIfNeeded();
        
        // 更新登录尝试次数
        loginAttempts.value++;
        
        // 短暂延迟后跳转
        await Future.delayed(const Duration(milliseconds: 300));
        
        // 跳转到主页面
        Get.offAllNamed(RouteNames.systemMain);
        
      } else {
        final message = result['message'] ?? '登录失败';
        _handleLoginFailure(message);
      }
      
    } catch (e) {
      debugPrint('$tag: 💥 登录流程异常: $e');
      _handleLoginFailure('网络连接异常，请检查网络后重试');
    } finally {
      isLoading.value = false;
      update(["login"]);
    }
  }
  
  /// 处理登录失败
  void _handleLoginFailure(String message) {
    hasError.value = true;
    errorMessage.value = message;
    
    // 增加重试次数
    _retryCount++;
    loginAttempts.value++;
    
    // 如果尝试次数过多，清空验证码
    if (_retryCount >= maxRetryCount) {
      verificationCode.value = '';
      codeController.clear();
      debugPrint('$tag: 达到最大重试次数，清空验证码');
    }
    
    update(["login"]);
    
    // 2秒后自动清除错误信息
    _startErrorClearTimer();
  }
  
  /// 启动错误信息自动清除定时器（2秒后清除）
  void _startErrorClearTimer() {
    // 取消之前的定时器
    _errorClearTimer?.cancel();
    
    // 启动新的定时器
    _errorClearTimer = Timer(const Duration(seconds: 2), () {
      hasError.value = false;
      errorMessage.value = '';
      update(["login"]);
      _errorClearTimer = null;
    });
  }
  
  /// 验证手机号
  bool _validatePhoneNumber() {
    validationErrors.clear();
    
    final phone = phoneNumber.value.trim();
    if (phone.isEmpty) {
      validationErrors['phone'] = '请输入手机号';
      hasError.value = true;
      errorMessage.value = '请输入手机号';
      update(["login"]);
      // 2秒后自动清除错误信息
      _startErrorClearTimer();
      return false;
    }
    
    // 验证手机号格式（11位数字）
    if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(phone)) {
      validationErrors['phone'] = '请输入正确的11位手机号';
      hasError.value = true;
      errorMessage.value = '请输入正确的11位手机号';
      update(["login"]);
      // 2秒后自动清除错误信息
      _startErrorClearTimer();
      return false;
    }
    
    return true;
  }
  
  /// 表单验证
  bool _validateForm() {
    validationErrors.clear();
    
    // 验证手机号
    if (!_validatePhoneNumber()) {
      return false;
    }
    
    // 验证验证码
    if (verificationCode.value.trim().isEmpty) {
      validationErrors['code'] = '请输入验证码';
    } else if (verificationCode.value.trim().length != 6) {
      validationErrors['code'] = '验证码为6位数字';
    } else if (!RegExp(r'^\d{6}$').hasMatch(verificationCode.value.trim())) {
      validationErrors['code'] = '验证码必须是6位数字';
    }
    
    // 验证是否同意协议
    if (!isAgreeProtocol.value) {
      validationErrors['protocol'] = '请先同意《用户手册》和《隐私政策》';
    }
    
    final isValid = validationErrors.isEmpty;
    
    if (!isValid) {
      hasError.value = true;
      errorMessage.value = validationErrors.values.first;
      // 2秒后自动清除错误信息
      _startErrorClearTimer();
    }
    
    update(["login"]);
    return isValid;
  }
  
  /// 清除字段错误
  void _clearFieldError(String fieldName) {
    if (validationErrors.containsKey(fieldName)) {
      validationErrors.remove(fieldName);
      if (validationErrors.isEmpty) {
        hasError.value = false;
        errorMessage.value = '';
        // 取消错误清除定时器
        _errorClearTimer?.cancel();
        _errorClearTimer = null;
      }
    }
  }
  
  /// 保存登录凭据（如果需要）
  Future<void> _saveCredentialsIfNeeded() async {
    try {
      // ❌ 不再保存手机号
      // 用户每次登录都需要重新输入
      
      // 仅保存登录时间用于统计
      await _storageService.setString('last_login_time', DateTime.now().toIso8601String());
      
      debugPrint('$tag: 已保存登录时间（不保存手机号）');
    } catch (e) {
      debugPrint('$tag: 保存登录凭据失败: $e');
    }
  }
  
  
  /// 忘记密码处理
  void onForgotPasswordTap() {
    debugPrint('$tag: 忘记密码点击');
    // TODO: 实现忘记密码功能
  }
  
  /// 用户手册点击处理
  void onUserManualTap() {
    debugPrint('$tag: 用户手册点击');
    Get.toNamed(
      RouteNames.myPrivacyPolicy,
      arguments: {'type': 'userManual'},
    );
  }
  
  /// 隐私政策点击处理
  void onPrivacyPolicyTap() {
    debugPrint('$tag: 隐私政策点击');
    Get.toNamed(
      RouteNames.myPrivacyPolicy,
      arguments: {'type': 'privacyPolicy'},
    );
  }
  
  /// 重置登录状态
  void resetLoginState() {
    debugPrint('$tag: 重置登录状态');
    
    isLoading.value = false;
    hasError.value = false;
    errorMessage.value = '';
    validationErrors.clear();
    loginAttempts.value = 0;
    _retryCount = 0;
    
    update(["login"]);
  }

  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit');
    
    // 设置文本控制器监听
    phoneController.addListener(() => onPhoneNumberChanged(phoneController.text));
    codeController.addListener(() => onVerificationCodeChanged(codeController.text));
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose');
    
    // 清理Timer资源
    _animationTimer?.cancel();
    _formTimer?.cancel();
    _smsCountdownTimer?.cancel();
    _errorClearTimer?.cancel();
    
    // 清理文本控制器
    phoneController.dispose();
    codeController.dispose();
    
    // 清理焦点节点
    phoneFocusNode.dispose();
    codeFocusNode.dispose();
    
    super.onClose();
  }
}
